package cn.edu.wtbu.wtbu_music_server.controller;

import cn.edu.wtbu.wtbu_music_server.dto.R;
import cn.edu.wtbu.wtbu_music_server.entity.Album;
import cn.edu.wtbu.wtbu_music_server.entity.Music;
import cn.edu.wtbu.wtbu_music_server.service.AlbumService;
import cn.edu.wtbu.wtbu_music_server.service.MusicService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 歌曲模块业务功能接口
 * 1. 添加歌曲
 * 2. 歌曲详情（包含专辑详情）
 * 3. 分页查询歌曲
 * 4. 删除歌曲
 * 5. 修改歌曲
 */
@Tag(name = "歌曲接口",description = "歌曲模块相关的Rest接口")
@RequestMapping("/music")
@RestController
public class MusicController  extends BaseController{

    @Autowired
    private MusicService musicService;
    @Autowired
    private AlbumService albumService;

    /**
     * 音乐添加,提供一个Music对象
     */
    @Operation(summary = "添加歌曲",description = "根据提供的音乐对象添加音乐信息")
    @PostMapping("/add")
    public R add(@RequestBody Music music) {
        boolean b = musicService.save(music);
        return b ? R.ok().setMsg("添加成功").setData(music) : R.fail().setMsg("添加失败");
    }

    /**
     * 根据id查询音乐信息，以及关联的专辑信息
     */
    @Operation(summary = "获取歌曲信息",description = "根据提供的音乐id查询音乐信息")
    @Parameter(name = "id",description = "音乐id",required = true)
    @GetMapping("/info")
    public R info(Integer id) {
        //根据音乐id查询音乐对象
        Music music = musicService.getById(id);
        //根据专辑id查询专辑对象
        Album album = albumService.getById(music.getAid());
        //将专辑对象设置给歌曲对象
        music.setAlbum(album);
        //返回数据
        return R.ok().setData(music);
    }

    /**
     * 分页查询歌曲信息
     */
    @Operation(summary = "分页查询歌曲信息",description = "根据提供的当前页码和每页数据条数分页查询歌曲信息")
    @Parameters({
            @Parameter(name = "page",description = "当前页码",required = true),
            @Parameter(name = "size",description = "每页数据条数",required = true)
    })
    @GetMapping("/list")
    public R list(Integer page, Integer size) {
        //分页查询歌曲列表
        List<Music> list = musicService.list(new Page<>(page, size));
        //获取所有的专辑id集合(去除重复，因此使用set集合)
        Set<Integer> albumIds = list.stream().map(Music::getAid).collect(Collectors.toSet());
        //查询所有的专辑信息
        List<Album> albumList = albumService.listByIds(albumIds);
        //将专辑id和专辑对象进行映射（包装成Map集合）
        Map<Integer, Album> map = albumList.stream().collect(Collectors.toMap(Album::getId, album -> album));
        //循环遍历所有歌曲，并将歌曲的专辑对象设置给歌曲对象
        list.forEach(music -> {
            music.setAlbum(map.get(music.getAid()));
        });
        return R.ok().setData(list);
    }

    /**
     * 根据音乐id删除音乐对象
     */
    @Operation(summary = "删除歌曲",description = "根据提供的音乐id删除音乐信息")
    @Parameter(name = "id",description = "音乐id",required = true)
    @DeleteMapping("/delete/{id}")
    public R delete(@PathVariable Integer id) {
        boolean b = musicService.removeById(id);
        return b ? R.ok().setMsg("删除成功") : R.fail().setMsg("删除失败");
    }

    /**
     * 根据音乐id修改音乐信息
     * @param music 包含更新后的音乐信息的对象，其中必须包含音乐的id。
     * @return 返回一个结果对象，如果修改成功，则返回成功消息；如果修改失败，则返回失败消息。
     */
    @Operation(summary = "更新歌曲",description = "根据提供的音乐对象更新音乐信息")
    @PutMapping("/update")
    public R update(@RequestBody Music music) {
        // 根据音乐id获取音乐资源
        Music m = musicService.getById(music.getId());
        // 检查音乐资源是否存在
        if(Objects.isNull(m)){
            return R.fail().setMsg("音乐资源不存在");
        }
        // 更新音乐信息
        boolean b = musicService.updateById(music);
        // 根据更新结果返回相应的消息
        return b ? R.ok().setMsg("修改成功") : R.fail().setMsg("修改失败");
    }


}
